/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO.MySQL;

import DAO.DAOInstanciaJogo;
import InstanciaJogo.InstanciaJogoSwing;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;

/**
 * DAOInstanciaJogoMySQL
 *
 * Versao 1.0
 *
 * Data Criação 18/11/2013
 *
 * @author Igor
 */
public class DAOInstanciaJogoMySQL extends DAOConexaoMySQL implements DAOInstanciaJogo {

    //Outros metodos
    @Override
    public InstanciaJogoSwing buscaInstanciaJogo(long idJogo) throws Exception {
        ResultSet result = null;
        InstanciaJogoSwing jogo = null;

        result = this.select.executeQuery("select\n"
                + "a.TEMPO_EXP_ROSTO,\n"
                + "a.TEMPO_TRANSICAO_IMAGENS,\n"
                + "a.REPETIR_APRESENTACAO_IMAGENS,\n"
                + "a.MSG_ACERTO_ERRO,\n"
                + "a.ID_MODO_JOGO\n"
                + "from instancia_jogo a\n"
                + "where a.ID_INSTANCIA_JOGO = " + idJogo);

        while (result.next()) {
            jogo = new InstanciaJogoSwing(0);

            jogo.setTempoApresentacaoImagens(result.getInt("TEMPO_EXP_ROSTO"));
            jogo.setTempoTransicaoImagens(result.getInt("TEMPO_TRANSICAO_IMAGENS"));
            jogo.setRepetirApresentacaoImagens(result.getInt("REPETIR_APRESENTACAO_IMAGENS"));
            jogo.setModoJogo(result.getLong("ID_MODO_JOGO"));

            if (result.getInt("MSG_ACERTO_ERRO") == 0) {
                jogo.setApresentaMensagemAcertoErro(false);
            } else {
                jogo.setApresentaMensagemAcertoErro(true);
            }
        }

        return jogo;
    }

    @Override
    public long gravaInstanciaJogo(InstanciaJogoSwing jogo, ArrayList<Integer> percsAvancarSubFase) throws Exception {
        long vReturn = -1;
        int msgAcertoErro = 0; //Nao apresenta as mensagens de acerto e erro

        //Apresenta as mensagens de acerto e erro
        if (jogo.isApresentaMensagemAcertoErro()) {
            msgAcertoErro = 1;
        }

        CallableStatement cs;
        cs = this.con.getCon().prepareCall("{? = call GRAVA_INSTANCIA_JOGO(?,?,?,?,?,?)}");

        cs.registerOutParameter(1, Types.NUMERIC);
        cs.setLong(2, jogo.getTempoTransicaoImagens());
        cs.setLong(3, jogo.getTempoApresentacaoImagens());
        cs.setLong(4, jogo.getRepetirApresentacaoImagens());
        cs.setInt(5, msgAcertoErro);
        cs.setLong(6, jogo.getModoJogo());
        cs.setLong(7, jogo.getFase());
        cs.execute();

        vReturn = cs.getLong(1);

        for (int i = 0; i < percsAvancarSubFase.size(); i++) {
            PreparedStatement stmt;
            stmt = this.con.getCon().prepareStatement("insert into perc_avancar_sub_fase (id_instancia_jogo, id_fase, id_sub_fase, perc_avancar_sub_fase)values(?,?,?,?)");

            stmt.setLong(1, vReturn);
            stmt.setLong(2,  jogo.getFase());
            stmt.setLong(3,  i+1);
            stmt.setInt(4, percsAvancarSubFase.get(i));
            stmt.executeUpdate();
            stmt.close();
        }

        this.con.getStm().executeBatch();

        return vReturn;
    }

    @Override
    public void gravaJogo(long idPessoa, long idJogo) throws Exception {
        PreparedStatement stmt;
        stmt = this.con.getCon().prepareStatement("insert into jogo (ID_PESSOA, ID_INSTANCIA_JOGO)values(?,?)");

        stmt.setLong(1, idPessoa);
        stmt.setLong(2, idJogo);
        stmt.executeUpdate();
        stmt.close();

        this.con.getStm().executeBatch();

    }

    @Override
    public void atualizaTempoInstanciaJogo(long idInstanciaJogo, long tempoJogo) throws Exception {
        CallableStatement cs;
        cs = this.con.getCon().prepareCall("call ATUALIZA_TEMPO_INSTANCIA_JOGO(?,?)");

        cs.setLong(1, idInstanciaJogo);
        cs.setLong(2, tempoJogo);
        cs.execute();

        this.con.getStm().executeBatch();
    }

}
